<?php
/**
 * 基于 List 的消息队列
 * Redis 的 List 数据结构可以用来实现简单的消息队列。常用命令包括 LPUSH（向队列左侧添加消息）和 RPOP（从队列右侧取出消息）。
 * 基本流程
 * 生产者：使用 LPUSH 向队列中添加消息。
 * 消费者：使用 RPOP 从队列中取出消息。
 * 添加数据 php mq/mqList.php mq
 * 消费数据 php mq/mqList.php
 */

class MqList
{
    /**
     * 添加数据
     */
    static function mq($data = ['task_id' => 1, 'message' => 'Hello World'])
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $data['task_id'] = date('YmdHis');
        $d = json_encode($data);
        $redis->lPush('queue:tasks', $d);
        echo "已进入队列.\n";
    }

    /**
     * 消费数据
     */
    static function server()
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        while (true) {
            $data = $redis->rPop('queue:tasks');
            if ($data) {
                $task = json_decode($data, true);
                //处理数据
                echo "Processing task: " . $task['task_id'] . "\n";
            } else {
                sleep(1); // 如果队列为空，休眠 1 秒后再检查
            }
        }
    }
}

if ('mq' ==  ($argv[1] ?? '') ||  'php-fpm' == PHP_SAPI) {
    MqList::mq();
    return;
}

MqList::server();







